//klasa opisujaca graf
#pragma once
#include <list>
#include <map>
#include "Vertex.h"
#include "PathFlow.h"

static const int INF = 9999;

struct Edge //struktura krawedzi
{
	string start; //poczatek
	string end; //koniec
	int	 capacity; //pojemnosc
};

class GraphDescription
{

public:
	int cargoAmount; //ilosc towaru
	map<string,Vertex> vertexList; //lista wierzcholkow

	GraphDescription(); 
	int getCargoAmount();
	void setCargoAmount(int newCargoAmount);
	void addVertex(Edge edge); //dodaj wierzcholek
	map<string,Vertex> getVertexList();
	void setVertexList(map<string,Vertex> newVertexList);
	void readGraphDescription(string fileName); //wczytaj graf z pliku
	void printVertexes(); //wypisz wierzcholki
	bool verifyGraphDescription(); //sprawdz poprawnosc grafu
	void describeVertexes(Vertex* startVertex); //znajdz scierzki do wierzcholkow
	void describeVertexesFlowMethod(Vertex* startVertex); //szukanie scierzek sposob 2
	void setStartRoute(); //ustaw poczatkowy wierzcholek do opisywania scierzek jako S
	void setStartRouteFlowMethod(); //ustaw poczatkowy wierzcholek do opisywania scierzek dla metody 2
	PathFlow* shortestPath(int maxAmountToSent); //metoda najkrotszych sciezek z krzyzowaniem
	void printResults(ostream& outSream, list<PathFlow*> flowDecompositionPaths);	
	void takeFlowFromPath(PathFlow* flowPath);
	string getMinnimalDistance(map<string,Vertex> Q, map<string,int> dist);
	void shortestPathsWithHybridization(); //metoda najkrotszych sciezek z krzyzowaniem
	void shortestPaths(); //metoda najkrotszych sciezek 
	void findRoutes(string vertexName); //znajdz scierzki z S do T
	std::pair<string,string> tryHybridize(PathFlow* flowPath);	
	string canHybridizeInVertex(PathFlow* flowPath, Vertex* vertexId);	
	void hybridize(string flowPath1, PathFlow* flowPath2, string vertexId);
	void generateGraph(int vertexCount, int blocks, float propability = 0.5);
	void printGrpah(ostream& outSream);
};